-- volvano_func.lua - 文件系统工具函数实现

-- 导入所需库
local fs = require("fs")
local cjson = require("cjson")


-- 文件写入函数
-- @param params 包含filePath和content的参数表
-- @return 返回操作结果表
local function write_file(params)
    log_info("调用文件写入函数")
    
    -- 检查参数是否有效
    if not params or not params.filePath then
        log_error("文件路径参数缺失")
        return {error = "文件路径参数缺失"}
    end
    
    if not params.content then
        log_error("文件内容参数缺失")
        return {error = "文件内容参数缺失"}
    end
    
    local file_path = params.filePath
    local content = params.content
    log_debug("尝试写入文件: " .. file_path)
    
    -- 尝试写入文件内容
    local success = fs.writeFile(file_path, content)
    if not success then
        log_error("文件写入失败: " .. file_path)
        return {error = "文件写入失败"}
    end
    
    log_info("文件写入成功: " .. file_path)
    return {success = true, filePath = file_path}
end

-- 创建目录函数
-- @param params 包含dirPath的参数表
-- @return 返回操作结果表
local function create_directory(params)
    log_info("调用目录创建函数")
    
    -- 检查参数是否有效
    if not params or not params.dirPath then
        log_error("目录路径参数缺失")
        return {error = "目录路径参数缺失"}
    end
    
    local dir_path = params.dirPath
    log_debug("尝试创建目录: " .. dir_path)
    
    -- 检查目录是否已存在
    if fs.exist(dir_path) then
        log_info("目录已存在: " .. dir_path)
        return {success = true, dirPath = dir_path, exists = true}
    end
    
    -- 尝试创建目录
    local success = fs.mkdir(dir_path)
    if not success then
        log_error("目录创建失败: " .. dir_path)
        return {error = "目录创建失败"}
    end
    
    log_info("目录创建成功: " .. dir_path)
    return {success = true, dirPath = dir_path}
end

-- 删除文件函数
-- @param params 包含filePath的参数表
-- @return 返回操作结果表
local function delete_file(params)
    log_info("调用文件删除函数")
    
    -- 检查参数是否有效
    if not params or not params.filePath then
        log_error("文件路径参数缺失")
        return {error = "文件路径参数缺失"}
    end
    
    local file_path = params.filePath
    log_debug("尝试删除文件: " .. file_path)
    
    -- 检查文件是否存在
    if not fs.exist(file_path) then
        log_info("文件不存在: " .. file_path)
        return {success = true, filePath = file_path, notExists = true}
    end
    
    -- 尝试删除文件
    local success = fs.unlink(file_path)
    if not success then
        log_error("文件删除失败: " .. file_path)
        return {error = "文件删除失败"}
    end
    
    log_info("文件删除成功: " .. file_path)
    return {success = true, filePath = file_path}
end

-- 删除文件或目录函数
-- @param params 包含path的参数表
-- @return 返回操作结果表
local function remove(params)
    log_info("调用删除文件或目录函数")
    
    -- 检查参数是否有效
    if not params or not params.path then
        log_error("路径参数缺失")
        return {error = "路径参数缺失"}
    end
    
    local path = params.path
    log_debug("尝试删除: " .. path)
    
    -- 检查路径是否存在
    if not fs.exist(path) then
        log_info("路径不存在: " .. path)
        return {success = true, path = path, notExists = true}
    end
    
    -- 尝试删除文件或目录
    local success = fs.remove(path)
    if not success then
        log_error("删除失败: " .. path)
        return {error = "删除失败"}
    end
    
    log_info("删除成功: " .. path)
    return {success = true, path = path}
end

-- 递归创建目录函数
-- @param params 包含path的参数表
-- @return 返回操作结果表
local function mk_path(params)
    log_info("调用递归创建目录函数")
    
    -- 检查参数是否有效
    if not params or not params.path then
        log_error("路径参数缺失")
        return {error = "路径参数缺失"}
    end
    
    local path = params.path
    log_debug("尝试递归创建目录: " .. path)
    
    -- 检查目录是否已存在
    if fs.exist(path) then
        log_info("路径已存在: " .. path)
        return {success = true, path = path, exists = true}
    end
    
    -- 尝试递归创建目录
    local success = fs.mkpath(path)
    if not success then
        log_error("递归创建目录失败: " .. path)
        return {error = "递归创建目录失败"}
    end
    
    log_info("递归创建目录成功: " .. path)
    return {success = true, path = path}
end

-- 删除目录函数
-- @param params 包含dirPath的参数表
-- @return 返回操作结果表
local function delete_directory(params)
    log_info("调用目录删除函数")
    
    -- 检查参数是否有效
    if not params or not params.dirPath then
        log_error("目录路径参数缺失")
        return {error = "目录路径参数缺失"}
    end
    
    local dir_path = params.dirPath
    log_debug("尝试删除目录: " .. dir_path)
    
    -- 检查目录是否存在
    if not fs.exist(dir_path) then
        log_info("目录不存在: " .. dir_path)
        return {success = true, dirPath = dir_path, notExists = true}
    end
    
    -- 尝试删除目录
    local success = fs.rmdir(dir_path)
    if not success then
        log_error("目录删除失败: " .. dir_path)
        return {error = "目录删除失败"}
    end
    
    log_info("目录删除成功: " .. dir_path)
    return {success = true, dirPath = dir_path}
end

-- 文件读取函数
-- @param params 包含filePath的参数表
-- @return 返回包含文件内容的结果表
local function read_file(params)
    log_info("调用文件读取函数")
    
    -- 检查参数是否有效
    if not params or not params.filePath then
        log_error("文件路径参数缺失")
        return {error = "文件路径参数缺失"}
    end
    
    local file_path = params.filePath
    log_debug("尝试读取文件: " .. file_path)
    
    -- 检查文件是否存在
    if not fs.exist(file_path) then
        log_error("文件不存在: " .. file_path)
        return {error = "文件不存在"}
    end
    
    -- 尝试读取文件内容
    local content = fs.readFile(file_path)
    if content == nil then
        log_error("文件读取失败: " .. file_path)
        return {error = "文件读取失败"}
    end
    
    log_info("文件读取成功: " .. file_path)
    return {content = content, filePath = file_path}
end

-- 文件读取一行函数
-- @param params 包含filePath和可选lineNumber的参数表
-- @return 返回包含文件行内容的结果表
local function read_line(params)
    log_info("调用文件读取一行函数")
    
    -- 检查参数是否有效
    if not params or not params.filePath then
        log_error("文件路径参数缺失")
        return {error = "文件路径参数缺失"}
    end
    
    local file_path = params.filePath
    local line_number = params.lineNumber or 0
    log_debug("尝试读取文件: " .. file_path .. ", 行号: " .. line_number)
    
    -- 检查文件是否存在
    if not fs.exist(file_path) then
        log_error("文件不存在: " .. file_path)
        return {error = "文件不存在"}
    end
    
    -- 尝试读取文件指定行内容
    local line_content = fs.readLine(file_path, line_number)
    if line_content == nil then
        log_error("文件行读取失败: " .. file_path .. ", 行号: " .. line_number)
        return {error = "文件行读取失败"}
    end
    
    log_info("文件行读取成功: " .. file_path .. ", 行号: " .. line_number)
    return {content = line_content, filePath = file_path, lineNumber = line_number}
end

-- 目录读取函数
-- @param params 包含dirPath的参数表
-- @return 返回包含目录内容的结果表
local function read_directory(params)
    log_info("调用目录读取函数")
    
    -- 检查参数是否有效
    if not params or not params.dirPath then
        log_error("目录路径参数缺失")
        return {error = "目录路径参数缺失"}
    end
    
    local dir_path = params.dirPath
    log_debug("尝试读取目录: " .. dir_path)
    
    -- 检查目录是否存在
    if not fs.exist(dir_path) then
        log_error("目录不存在: " .. dir_path)
        return {error = "目录不存在"}
    end
    
    -- 尝试读取目录内容
    local entries = fs.readDir(dir_path)
    if entries == nil then
        log_error("目录读取失败: " .. dir_path)
        return {error = "目录读取失败"}
    end
    
    log_info("目录读取成功: " .. dir_path)
    return {entries = entries, dirPath = dir_path}
end

-- 定义在独立进程中运行Lua文件的函数
local function lua_run_file_in_process(params)
    log_info("准备在独立进程中运行Lua文件: " .. (params.filePath or "nil"))
    
    -- 检查参数
    if not params or not params.filePath then
        log_error("缺少必需的filePath参数")
        return {success = false, error = "缺少必需的filePath参数"}
    end
    
    -- 调用C实现的lua_run_file_in_process函数
    local ret = lua_run_file(params.filePath)
    
    if ret == 0 then  -- 假设RET_OK是0
        log_info("启动" .. params.filePath, "成功")
        return {success = true, message = "启动" .. params.filePath .. "成功"}
    else
        log_error("在独立进程中启动Lua文件失败，错误码: " .. tostring(ret))
        return {success = false, error = "在独立进程中启动Lua文件失败", code = ret}
    end
end

-- 封装销毁指定fd的Lua运行实例的函数
local function volcano_lua_destroy_file(params)
    log_info("准备销毁指定fd的Lua运行实例: " .. (params.fd or "nil"))
    
    -- 检查参数
    if not params or params.fd == nil then
        log_error("缺少必需的fd参数")
        return {success = false, error = "缺少必需的fd参数"}
    end
    
    -- 调用C实现的lua_destroy_file函数
    local ret = lua_destroy_file(params.fd)
    
    if ret == 0 then  -- 假设RET_OK是0
        log_info("销毁fd为" .. params.fd .. "的Lua运行实例成功")
        return {success = true, message = "销毁Lua运行实例成功", fd = params.fd}
    else
        log_error("销毁Lua运行实例失败，错误码: " .. tostring(ret))
        return {success = false, error = "销毁Lua运行实例失败", code = ret, fd = params.fd}
    end
end

-- 封装获取所有正在运行的程序参数的函数
local function volcano_get_all_running_programs(params)
    log_info("准备获取所有正在运行的Lua程序信息")
    
    -- 调用C实现的lua_get_all_running_programs函数
    local json_str = lua_get_all_running_programs()
    
    if json_str then
        log_info("获取所有正在运行的Lua程序信息成功")
        -- 尝试解析JSON字符串
        local status, result = pcall(cjson.decode, json_str)
        if status then
            return {success = true, programs = result}
        else
            log_error("解析程序信息JSON失败: " .. tostring(result))
            return {success = true, raw_data = json_str, parse_error = tostring(result)}
        end
    else
        log_error("获取所有正在运行的Lua程序信息失败")
        return {success = false, error = "获取程序信息失败"}
    end
end

-- 初始化函数，注册所有工具函数
-- @param VolcanoApi VolcanoApi类对象
function volvanoFuncInit(VolcanoApi)
    log_info("开始注册火山引擎工具函数")
    
    -- 检查VolcanoApi是否有效
    if not VolcanoApi or not VolcanoApi.registerGlobalFunction then
        log_error("无效的VolcanoApi参数")
        return false
    end
    
    -- 注册文件读取函数
    local read_file_params = {
        type = "object",
        properties = {
            filePath = {
                type = "string",
                description = "要读取的文件路径"
            }
        },
        required = {"filePath"}
    }
    
    local success, err = VolcanoApi.registerGlobalFunction(
        "read_file",
        "读取指定路径的文件内容",
        read_file_params,
        read_file
    )
    
    -- 注册文件读取一行函数
    local read_line_params = {
        type = "object",
        properties = {
            filePath = {
                type = "string",
                description = "要读取的文件路径"
            },
            lineNumber = {
                type = "number",
                description = "要读取的行号，默认0（读取下一行）",
                required = false
            }
        },
        required = {"filePath"}
    }
    
    success, err = VolcanoApi.registerGlobalFunction(
        "read_line",
        "读取指定路径文件的一行内容",
        read_line_params,
        read_line
    )
    
    if not success then
        log_error("注册read_file函数失败: " .. (err or "未知错误"))
    else
        log_info("成功注册read_file全局函数")
    end
    
    -- 注册目录读取函数
    local read_directory_params = {
        type = "object",
        properties = {
            dirPath = {
                type = "string",
                description = "要读取的目录路径"
            }
        },
        required = {"dirPath"}
    }
    
    success, err = VolcanoApi.registerGlobalFunction(
        "read_directory",
        "读取指定路径的目录内容",
        read_directory_params,
        read_directory
    )
    
    if not success then
        log_error("注册read_directory函数失败: " .. (err or "未知错误"))
    else
        log_info("成功注册read_directory全局函数")
    end
    
    -- 注册文件写入函数
    local write_file_params = {
        type = "object",
        properties = {
            filePath = {
                type = "string",
                description = "要写入的文件路径"
            },
            content = {
                type = "string",
                description = "要写入的文件内容"
            }
        },
        required = {"filePath", "content"}
    }
    
    success, err = VolcanoApi.registerGlobalFunction(
        "write_file",
        "写入内容到指定路径的文件",
        write_file_params,
        write_file
    )
    
    if not success then
        log_error("注册write_file函数失败: " .. (err or "未知错误"))
    else
        log_info("成功注册write_file全局函数")
    end
    
    -- 注册目录创建函数
    local create_directory_params = {
        type = "object",
        properties = {
            dirPath = {
                type = "string",
                description = "要创建的目录路径"
            }
        },
        required = {"dirPath"}
    }
    
    success, err = VolcanoApi.registerGlobalFunction(
        "create_directory",
        "创建指定路径的目录",
        create_directory_params,
        create_directory
    )
    
    if not success then
        log_error("注册create_directory函数失败: " .. (err or "未知错误"))
    else
        log_info("成功注册create_directory全局函数")
    end
    
    -- 注册文件删除函数
    local delete_file_params = {
        type = "object",
        properties = {
            filePath = {
                type = "string",
                description = "要删除的文件路径"
            }
        },
        required = {"filePath"}
    }
    
    success, err = VolcanoApi.registerGlobalFunction(
        "delete_file",
        "删除指定路径的文件",
        delete_file_params,
        delete_file
    )
    
    if not success then
        log_error("注册delete_file函数失败: " .. (err or "未知错误"))
    else
        log_info("成功注册delete_file全局函数")
    end
    
    -- 注册目录删除函数
    local delete_directory_params = {
        type = "object",
        properties = {
            dirPath = {
                type = "string",
                description = "要删除的目录路径"
            }
        },
        required = {"dirPath"}
    }
    
    success, err = VolcanoApi.registerGlobalFunction(
        "delete_directory",
        "删除指定路径的目录",
        delete_directory_params,
        delete_directory
    )
    
    if not success then
        log_error("注册delete_directory函数失败: " .. (err or "未知错误"))
    else
        log_info("成功注册delete_directory全局函数")
    end
    
    -- 注册删除文件或目录函数
    local remove_params = {
        type = "object",
        properties = {
            path = {
                type = "string",
                description = "要删除的文件或目录路径"
            }
        },
        required = {"path"}
    }
    
    success, err = VolcanoApi.registerGlobalFunction(
        "remove",
        "删除指定路径的文件或目录",
        remove_params,
        remove
    )
    
    if not success then
        log_error("注册remove函数失败: " .. (err or "未知错误"))
    else
        log_info("成功注册remove全局函数")
    end
    
    -- 注册递归创建目录函数
    local mk_path_params = {
        type = "object",
        properties = {
            path = {
                type = "string",
                description = "要递归创建的目录路径"
            }
        },
        required = {"path"}
    }
    
    success, err = VolcanoApi.registerGlobalFunction(
        "mk_path",
        "递归创建指定路径的目录",
        mk_path_params,
        mk_path
    )
    
    if not success then
        log_error("注册mk_path函数失败: " .. (err or "未知错误"))
    else
        log_info("成功注册mk_path全局函数")
    end
    
    -- 注册在独立进程中运行Lua文件的函数
    local lua_run_file_params = {
        type = "object",
        properties = {
            filePath = {
                type = "string",
                description = "要在独立进程中运行的Lua文件路径"
            }
        },
        required = {"filePath"}
    }
    
    success, err = VolcanoApi.registerGlobalFunction(
        "lua_run_file_in_process",
        "在独立进程中运行指定路径的Lua文件",
        lua_run_file_params,
        lua_run_file_in_process
    )
    
    if not success then
        log_error("注册lua_run_file_in_process函数失败: " .. (err or "未知错误"))
    else
        log_info("成功注册lua_run_file_in_process全局函数")
    end
    
    -- 注册销毁指定fd的Lua运行实例的函数
    local lua_destroy_file_params = {
        type = "object",
        properties = {
            fd = {
                type = "number",
                description = "要销毁的Lua运行实例的文件描述符"
            }
        },
        required = {"fd"}
    }
    
    success, err = VolcanoApi.registerGlobalFunction(
        "volcano_lua_destroy_file",
        "销毁指定文件描述符的Lua运行实例",
        lua_destroy_file_params,
        volcano_lua_destroy_file
    )
    
    if not success then
        log_error("注册volcano_lua_destroy_file函数失败: " .. (err or "未知错误"))
    else
        log_info("成功注册volcano_lua_destroy_file全局函数")
    end
    
    -- 注册获取所有正在运行的程序参数的函数
    success, err = VolcanoApi.registerGlobalFunction(
        "volcano_get_all_running_programs",
        "获取所有正在运行的Lua程序信息",
        {},
        volcano_get_all_running_programs
    )
    
    if not success then
        log_error("注册volcano_get_all_running_programs函数失败: " .. (err or "未知错误"))
    else
        log_info("成功注册volcano_get_all_running_programs全局函数")
    end

    log_info("火山引擎工具函数注册完成")
    return true
end



-- 导出初始化函数
return {
    volvanoFuncInit = volvanoFuncInit
}
